package org.tissou.server.Operations;

import org.tissou.client.Services.Compte;
import org.tissou.client.Services.Parametres;
import org.tissou.client.Services.CategorieInfos;
import org.tissou.client.Services.MonException;
import org.tissou.server.Base.Categorie;
import org.tissou.server.Utils.Variables_Globales;

import java.util.List;
import java.util.ArrayList;
import java.util.Date;

/**
 * Created by IntelliJ IDEA.
 * User: Claire
 * Date: 11-Jan-2009
 * Time: 15:17:46
 * To change this template use File | Settings | File Templates.
 */
public class Operation_TransfertMonnaie_Personnel extends Operation_Base {
  //exemple: quand je retire de l'argent de mon compte BNP sur un automate Barclays'
  Compte Compte_Debourseur;
  Compte Compte_Receveur;
  Float Somme_Deboursee;
  Float Somme_Recue;
  boolean Verifie;

  CategorieInfos Categorie;
  String Libelle_Debourseur;
  String Libelle_Receveur;

  public Operation_TransfertMonnaie_Personnel(Date date, Compte compte_debourseur,
                                               Compte compte_receveur,
                                               float somme_deboursee,
                                               float somme_recue,
                                               boolean verifie){
    Date = date;
    Compte_Debourseur = compte_debourseur;
    Compte_Receveur =  compte_receveur;
    Somme_Deboursee = somme_deboursee;
    Somme_Recue = somme_recue;
    Verifie = verifie;

    Categorie parent = Variables_Globales.Tout.rechercherCategorieDansDescendance("Transfert");
    Categorie = (parent.rechercherCategorieDansDescendance(String.format("%s vers %s",
        Compte_Debourseur.getMonnaie().getNomMonnaie(), Compte_Receveur.getMonnaie().getNomMonnaie()))).getInfos();
    Libelle_Debourseur = String.format("Vers %s", Compte_Receveur.getNomCompte());
    Libelle_Receveur = String.format("Depuis %s", Compte_Debourseur.getNomCompte());
    TypeTransaction_Nom = "Operation transfert monnaie personnel";
  }

  private static boolean ConstruireAvecParametres_Compatibilite(Parametres parametres) {
    boolean resultat = true;
    if(!(parametres.NombreSommes() == 2)){
      throw new MonException("Une des deux sommes n'a pas ete rentree pour le transfert " +
          "d'une monnaie a une autre");
    }
    if (!(parametres.NombreComptes() == 2)){
      throw new MonException("Un des deux comptes n'a pas ete selectionne pour le transfert" +
          "de monnaie");
    }

    resultat &= (parametres.NombreCategories() == 0);
    resultat &= (parametres.NombreProprietaires() == 0);
    resultat &= (parametres.NombreLibelles() == 0);
    resultat &= (parametres.NombreMonnaies() == 0);
    resultat &= (parametres.NombreDettes() == 0);

    return resultat;
  }

  /*
  Operation_Transfertmonnaiepersonnel:
    Date Date = date;
    Boolean Verifie = verifie;
    OperationFactoryInfos.TypeOperation Typeoperation = OPERATION_TRANSFERTMONNAIEPERSONNEL;

    List<CategorieInfos> Categories = void;
    List<ProprietaireInfos> Proprietaires = void;
    List<Compte> Comptes = compte debourseur, compte receveur;
    List<String> Libelles = new ArrayList<String>() = void;
    List<Dette> Dettes = new ArrayList<Dette>() = void;
    List<MonnaieInfos> Monnaies = new ArrayList<MonnaieInfos>() = void;
    List<Float> Sommes = new ArrayList<Float>() = somme deboursee, somme recue;
  */

  private static Operation_TransfertMonnaie_Personnel ConstruireAvecParametres_Construction(
      Parametres parametres) {
    return new Operation_TransfertMonnaie_Personnel(parametres.getDate(),
        parametres.getComptes().get(0),
        parametres.getComptes().get(1),
        parametres.getSommes().get(0),
        parametres.getSommes().get(1),
        parametres.getVerifie()
    );
  }

  public static Operation_TransfertMonnaie_Personnel ConstruireAvecParametres(Parametres parametres){
    if(ConstruireAvecParametres_Compatibilite(parametres)){
      return ConstruireAvecParametres_Construction(parametres);
    }
    else
      throw new MonException("Les parametres ne sont pas compatibles pour creer cette operation.");
  }

  public boolean Parametres_Compatibles(){
    if(Compte.MonnaiesIdentiques(Compte_Debourseur, Compte_Receveur)){
      throw new MonException("Les deux comptes ont la meme monnaie, ca ne va pas.");
    }
    if(!Compte.ProprietairesIdentiques(Compte_Debourseur, Compte_Receveur)){
      throw new MonException("Les deux proprietaire ne sont pas identiques, ca ne va pas.");
    }
    if(Somme_Deboursee<0){
      throw new MonException("La somme deboursee est strictement negative, ca ne va pas.");
    }
    if(Somme_Recue<0){
      throw new MonException("La somme recue est strictement negative, ca ne va pas.");
    }
    if(Compte_Debourseur.estCeQueTesVirtuelMec()){
      throw new MonException("Le compte debourseur ne correspond pas a un compte reel, ca ne vas pas.");
    }
    if(Compte_Receveur.estCeQueTesVirtuelMec()){
      throw new MonException("Le compte receveur ne correspond pas a un compte reel, ca ne vas pas.");
    }
    return true;
  }

  public List<Transaction> Retourne_Transactions() {
    List<Transaction> AAjouter = new ArrayList<Transaction>();
    AAjouter.add(new Transaction(Date, Compte_Debourseur, Categorie, Libelle_Debourseur, - Somme_Deboursee,
        Verifie, null));
    AAjouter.add(new Transaction(Date, Compte_Receveur, Categorie, Libelle_Receveur, Somme_Recue,
        Verifie, null));
    return AAjouter;
  }
}
